$(function(){
    function GetUnitsDictionary(area_id, caller) {
		var area = $('#'+area_id);
		var vdiv = area_id+'Tab';

		area.html('<div id="'+vdiv+'Pager"></div><table id="'+vdiv+'"></table>');

		var pager_id = '#' + vdiv + 'Pager';
        var pager = $(pager_id);
		
        var el_met_id;
        var el_met_name;
        var met_name = '';
		
        var el_met_opt_id;
        var el_met_opt_name;
        var met_opt_name = '';
		
		var edit_div = 'div#editmod' + vdiv;

        var gritab;
        var col_order = [0, 1, 2, 3, 4, 5, 6, 7];
        var col_names = ['ID', 'Шифр', 'Полное описание', 'Метрика ID', 'Метрика', 'Доп.метрика ID', 'Доп.метр.', 'Множитель' ];
        var col_model = [
		    { name: 'id', index: 'uni_id', hidden: true, width: 1, editable: false, fixed: true },
		    { name: 'uni_name', index: 'uni_name', hidden: false, width: 100, editable: true, 
                    editoptions: { maxlength: "16", style: "width:250px;"}, 
					formoptions: { label: '<div class="jqg-form-label">Шифр</div>'}
			},					
		    { name: 'uni_full', index: 'uni_full', hidden: false, width: 400, editable: true, edittype: 'textarea',
                    editoptions: { maxlength: "255", style: "width:252px; height:50px; resize:none;"}, 
					formoptions: { label: '<div class="jqg-form-label">Описание</div>'} 
			},					
		    { name: 'uni_met_id', index: 'uni_met_id', hidden: true, width: 1, editable: true, 
                    editoptions: { maxlength: "16", dataInit: function (el) { el_met_id = el; } } 
			}, 					
		    { name: 'met_name', index: 'met_name', hidden: false, width: 80, editable: true,
		        editoptions: { maxlength: "16", style: "width:250px;", dataInit: function (el) { el_met_name = el; } },
				formoptions: { label: '<div class="jqg-form-label">Метрика</div>'}
		    },			
		    { name: 'uni_met_opt_id', index: 'uni_met_opt_id', hidden: true, width: 1, editable: true, 
                    editoptions: { maxlength: "16", dataInit: function (el) { el_met_opt_id = el; } }
			}, 		
		    { name: 'met_opt_name', index: 'met_opt_name', hidden: false, width: 80, editable: true,
		        editoptions: { maxlength: "16", style: "width:250px;", dataInit: function (el) { el_met_opt_name = el; } },
				formoptions: { label: '<div class="jqg-form-label">Доп.метрика</div>'}
		    },			
		    { name: 'uni_met_mul', index: 'uni_met_mul', hidden: false, width: 80, editable: true, 
                    editoptions: { maxlength: "16", style: "width:250px;"}, 
					formoptions: { label: '<div class="jqg-form-label">Множитель</div>'} 
			}					
        ];
        var jqgo = {
            url: 'index.php',
            editurl: 'index.php',
            datatype: 'json',
            postData: { q: 'units/index' },
            emptyrecords: true,
            autowidth: false,
            gridview: true,
            hidegrid: false,
            hoverrows: true,
            recordpos: 'right',
            scrollrows: true,
            multiselect: true,
            multiselectWidth: 25,
            multiboxonly: true,
            mtype: 'POST',
            shrinkToFit: false,
            colNames: col_names,
            colModel: col_model,
            page: 1,
            pager: pager,
            pagerpos: 'right',
            rowNum: 15,
            rowList: [15, 45, 150],
            loadui: 'disable',
            toolbar: [false, 'top'],
            filterbar: false,
            height: area.innerHeight() - 75,
            width: area.innerWidth() - 2,
            sortname: 'uni_name',
            sortorder: 'asc',
            sortable: true,
            caption: '',
            loadError: function (xhr, status, error) {
                alert("Ошибка загрузки даных");
            },
            loadComplete: function (data) {
                switch( data.userdata.errcode ) {
                    case 0:
                        break;
                    case 999:    
                        alert("Ваша сессия закончилась по таймауту.\nПожалуйста перерегистрируйтесь.");
                        break;
                    case 99:    
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32', caller.Close );
                        break;
                    default:
                        alert( data.userdata.errmess );
                        break;
                }                
            },
            ondblClickRow: function (id) {
                $('#' + vdiv).jqGrid('editGridRow', id,
                {
					width: 400,
                    modal: true,
                    jqModal: true,
                    zIndex: app.jqgrid_form_min_z_index,
					resize: false,
//                    closeOnEscape: true,
                    editData: { q: 'units/update' },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
                    afterShowForm: onShowEditForm,
                    afterSubmit: responseOnSubmit,
                    viewPagerButtons: false,
                    closeAfterEdit: true,
					onClose: onCloseEditForm
                }
                );
            }
        };

// Создадим jqGrid
        gritab = $('#' + vdiv).jqGrid(jqgo);

// Индикация ошибок при вводе, ред., удал.
        function TestNewData(post, formid) {
            var result = true, mess = '';
/*			
            if( post.uni_met_id == '' || post.met_name == '' || met_name == '' || post.met_name != met_name ) {
				post.uni_met_id = post.met_name = ''
				$(el_met_id).val(''); $(el_met_name).val(''); met_name = '';
			}
			
            if( post.uni_met_opt_id == '' || post.met_opt_name == '' || met_opt_name == '' || post.met_opt_name != met_opt_name ) {
				post.uni_met_opt_id = post.met_opt_name = '';
				$(el_met_opt_id).val(''); $(el_met_opt_name).val(''); met_opt_name = '';
			}
			
			if( post.uni_name == '' || post.uni_full == '' || post.uni_met_id == '' || 
				( post.uni_met_opt_id != '' && post.uni_met_mull == '') || ( post.uni_met_opt_id == '' && post.uni_met_mull != '')) {
                result = false;
                mess = 'Данные введены с ошибками !!!';
            }
*/
            return[result,mess];
        }
        
// Индикация серверных ошибок добавления, ред., удал.
        function responseOnSubmit(response, postdata) {
            var rsp = $.parseJSON(response.responseText);
            var success = true;
            var msg = '';

            if (rsp.errcode) {
                success = false;
                msg = rsp.errmess;
            }
				
            return [success, msg];
        }

		function onShowEditForm(fm) {
			SetMetHack();
			SetMetOptHack();
            $(edit_div).css({'overflow':'visible'}).shadow();
		}
		        
		function onCloseEditForm() {
			$(el_met_name).autocomplete( "destroy" ).unbind();
			$(el_met_opt_name).autocomplete( "destroy" ).unbind();
			return true;
		}
		
// Напоминание о выборе строки
		function selRowPlease() {
			app.alert('AlertDlg', 'Внимание', "Пожалуйста, выберите строку в таблице.", 'app-icon-stop32');
		}
	
// Навигатор - создаем панель инструментов
        gritab.jqGrid('navGrid', pager_id, {
				add:false,del:false,edit:false,view:false,search:false,refresh:false });
        
// Пользовательский навигатор - создать
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Создать',
            title: 'Создать запись',
            buttonicon: 'ui-icon-plus',
            onClickButton: function() { 
				gritab.jqGrid('editGridRow', 'new', {
					width: 400,
					resize: false,
                    modal: true,
                    jqModal: true,
					zIndex: app.jqgrid_form_min_z_index,
//                    closeOnEscape: true,
                    editData: { q: 'units/insert' },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
                    afterShowForm: onShowEditForm,
                    afterSubmit: responseOnSubmit,
                    closeAfterAdd: false,
					onClose: onCloseEditForm
				});
			}
        });

// Пользовательский навигатор - редактирование
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Изменить',
            title: 'Редактировать выбранную запись',
            buttonicon: 'ui-icon-pencil',
            onClickButton: function() { 
				var curr_id = gritab.getGridParam('selrow');
				if( !curr_id ) { selRowPlease(); return; }
				gritab.jqGrid('editGridRow', curr_id, {
					width: 400,
					resize: false,
                    modal: true,
                    jqModal: true,
					zIndex: app.jqgrid_form_min_z_index,
//                    closeOnEscape: true,
                    editData: { q: 'units/update' },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
                    afterShowForm: onShowEditForm,
                    afterSubmit: responseOnSubmit,
 					beforeSubmit: TestNewData, 
					viewPagerButtons: false,
                    closeAfterEdit: true,
					onClose: onCloseEditForm
				});
			}
        });
// Пользовательский навигатор - удаление
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Удалить',
            title: 'Удаление выбранной записи',
            buttonicon: 'ui-icon-trash',
            onClickButton: function() { 
				var rowlist = gritab.getGridParam('selarrrow').toString();
				if( !rowlist ) { selRowPlease(); return; }
				gritab.jqGrid('delGridRow', rowlist, {
                    modal: true,
                    jqModal: true,
                    width: 250,
					msg: '<table style="width:240px;margin-top:16px;"><tr><td style="width:50px;">'+
							'<div class="app-icon-quest32"></div></td><td>Удалить выбранную запись(и) ?</td></tr></table>',
					resize: false,
					zIndex: app.jqgrid_form_min_z_index,
                    closeOnEscape: true,
                    delData: { q: 'units/delete' },
                    afterShowForm: function() { $('div#delmod' + vdiv).shadow(); },
                    afterSubmit: responseOnSubmit
				});
			}
        });
// Пользовательский навигатор - просмотр
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Просмотр',
            title: 'Показать в виде формы',
            buttonicon: 'ui-icon-document',
            onClickButton: function() { 
				var curr_id = gritab.getGridParam('selrow');
				if( !curr_id ) { selRowPlease(); return; }
				gritab.jqGrid('viewGridRow', curr_id, {
					width: 400,
					resize: true,
                    modal: true,
                    jqModal: true,
					zIndex: app.jqgrid_form_min_z_index,
                    closeOnEscape: true,
                    viewPagerButtons: false,
					labelswidth: '35%',
					beforeShowForm: function(fm) { 
						$(fm).find("table:first td").css({'white-space':'normal','vertical-align':'top'});
						$('div#viewmod' + vdiv).shadow(); 
					}
				});
			}
        });
// Пользовательский навигатор - обновить
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Обновить',
			title: 'Обновить таблицу',
			buttonicon: 'ui-icon-refresh',
			onClickButton: function() { 	gritab.trigger("reloadGrid"); }
		});    

// Делаем ширину панели кнопок максимальной
		$('td#'+area_id+'TabPager_center').width(2);
		
        gritab.filterToolbar({ searchOnEnter: false, afterSearch: function () { } });

        function SetMetHack() {
            $(el_met_name).autocomplete({
				html: true,
				appendTo: edit_div,
                source: function (request, responce) {
                    $.post('index.php', { q: 'metrics/find', term: request.term },
                    function (rsp, textStatus) {
                        if (rsp.errcode) {
                            if (rsp.errcode == '999') { alert(rsp.errmess); }
                            else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
                            responce();
                            return;
                        }
                        if (rsp.data) {
                            responce($.map(rsp.data, function (item) {
                                return { label: item.name + ' ( '+item.full+' )', 
										value:item.value, name:item.name }
                            }));
                            return;
                        }
                        responce();
                    }, 
                    'json');
                },
                minLength: 1, autoFocus: true,
                focus: function (event, ui) { return false; },
                select: function (event, ui) {
                    $(el_met_id).val(ui.item.value);
                    met_name = ui.item.name.replace(/<(b|\/b)>/g,'');
                    $(el_met_name).val(met_name);
                    return false;
                }
            });
			met_name = $(el_met_name).val();
            $(el_met_name).bind( 'focusout', function () { 
                if( $(el_met_name).val() != met_name ) { 
                    met_name = ''; $(el_met_name).val(""); $(el_met_id).val("");
                }
            });            
        }

        function SetMetOptHack() {
            $(el_met_opt_name).autocomplete({
				html: true,
				appendTo: edit_div,
                source: function (request, responce) {
                    $.post('index.php', { q: 'metrics/find', term: request.term },
                    function (rsp, textStatus) {
                        if (rsp.errcode) {
                            if (rsp.errcode == '999') { alert(rsp.errmess); }
                            else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
                            responce();
                            return;
                        }
                        if (rsp.data) {
                            responce($.map(rsp.data, function (item) {
                                return { label: item.name + ' ( '+item.full+' )', 
										value:item.value, name:item.name }
                            }));
                            return;
                        }
                        responce();
                    }, 
                    'json');
                },
                minLength: 1, autoFocus: true,
                focus: function (event, ui) { return false; },
                select: function (event, ui) {
                    $(el_met_opt_id).val(ui.item.value);
                    met_opt_name = ui.item.name.replace(/<(b|\/b)>/g,'');
                    $(el_met_opt_name).val(met_opt_name);
                    return false;
                }
            });
			met_opt_name = $(el_met_opt_name).val();
            $(el_met_opt_name).bind( 'focusout', function () {
				if( $(el_met_opt_name).val() != met_opt_name ) {
                    met_opt_name = ''; $(el_met_opt_id).val(""); $(el_met_opt_name).val('');
				}
            });            
        }

		this.Destroy = function() {
			gritab.GridDestroy(vdiv);
			area.find('*').remove();
		};
		this.Resize = function() {
			gritab.setGridWidth( area.innerWidth() - 2 );
			gritab.setGridHeight( area.innerHeight() - 75 );
		}

    };  // End of create function definition


    app.ShowUnitsDictionary = function (dlgID) {
        var oTab;
        var aldlg = $('#' + dlgID);
		var me = this;

        if ($('#' + dlgID + 'Tab').length) return;

        aldlg.dialog(
        {
            modal: false, title: 'Справочник материалов и комплектующих',
            height: 452, width: 814,
			closeOnEscape: true,
            autoOpen: false,
            resizable: true,
			resize: function( e, ui ) { oTab.Resize(); },
            open: function () { 
				oTab = new GetUnitsDictionary(dlgID, me);
				$('div[aria-describedby="' + dlgID + '"]').shadow() 
			},
            close: function () {
                if (oTab) oTab.Destroy();
                aldlg.dialog("destroy");
            }
        });

		this.Close = function() { aldlg.dialog('close'); };

        aldlg.dialog('open');
    }
});
